package com.jml.二期.HashMap003;

import java.util.LinkedList;

public class JmlLinkedListMap<K, V> implements JmlMap<K, V> {
    // 存放我们的hashMap元素
    private Object[] objects = new Object[100];
    private LinkedList<Entry>[] entrys = new LinkedList[100];

    @Override
    public int size() {
        return 0;
    }

    @Override
    public V put(K key, V value) {
        // int hashCode = key.hashCode();
        // int hash = hashCode % objects.length;
        // objects[hash] = value;
        // A hashCode=97%100=97
        // 97 hashCode=97%100=97
        // 什么是HashCode碰撞问题：两个对象hashCode相同的，但是对象的值不同 技术 链表技术
        // 1.计算到hash值
        int hash = hash(key);
        LinkedList<Entry> linkedList = entrys[hash];
        Entry entry = new Entry(key, value);
        if (linkedList == null) {
            // 2. 没有发生hashCode冲突问题
            linkedList = new LinkedList();
            linkedList.add(entry);
            entrys[hash] = linkedList;
            return value;
        }
        // hashCode发生了碰撞问题 检查是否是同一个key
        for (Entry ety : linkedList) {
            // 如果 hashCode相同且equals也相同说明 相同的key 直接覆盖
            if (ety.getKey().equals(key)) {
                ety.setValue(value);
                return value;
            }
        }
        // hashCode相同但是对象值不同
        linkedList.add(entry);
        entrys[hash] = linkedList;
        return value;
        /// 学习方法
    }

    private int hash(K key) {
        int hashCode = key.hashCode();
        int hash = hashCode % objects.length;
        return hash;
    }

    @Override
    public V get(K key) {
        int hash = hash(key);
        LinkedList<Entry> linkedList = entrys[hash];
        for (Entry ety : linkedList) {
            // 如果 hashCode相同且equals也相同说明 相同的key 直接覆盖
            if (ety.getKey().equals(key)) {
                return (V)ety.getValue();
            }
        }
        return null;
    }
    // hashMap为什么能够查询效率非常高（jdk1.7版本） 直接通过计算hash值 使用hash定位直接数组存放位置 查询效率非常高的

    public static void main(String[] args) {
        System.out.println(197 % 100);
    }

    class Entry<K, V> implements JmlMap.Entry<K, V> {
        // key
        private K k;
        // value
        private V v;

        @Override
        public K getKey() {
            return this.k;
        }

        @Override
        public V getValue() {
            return this.v;
        }

        @Override
        public V setValue(V value) {
            this.v = v;
            return this.v;
        }

        public Entry(K k, V v) {
            this.k = k;
            this.v = v;
        }
    }

}
